package y_2025.m03.d14.t03;

public class LiBai {
    static int[] a = new int[16]; // 下标为1~15的元素表示李白路过的地标，可能是店，可能是花
    static int[] book = new int[2]; // 标记店和花出现的次数，book[0]为逢店的次数，book[1]表示遇花的次数
    static int n = 14; // 表示要排序十四次，因为最后一次为花，不参与主动排序
    static int wine = 2; // 表示酒的量，单位为斗
    static int sum = 0; // 表示答案的个数

    public static void main(String[] args) {
        dfs(1); // 从第一个位置开始排序
    }

    static void dfs(int step) {
        int ww; // 定义新变量存储初始酒量的值，避免对wine变量做修改

        /*====================第二部分====================*/
        if (step > n) { // 当step==15，即>14时，表示已经实现了14次的排序，可以尝试基于这15次的排序对酒量做计算
            ww = wine;
            for (int i = 1; i < step; i++) { // step=15
                if (a[i] == 0) ww *= 2;
                else ww -= 1;
            }
            ww -= 1; // 第十五次固定为花，直接减去一斗酒
            if (ww == 0) { // 判断酒是否喝完
                sum++; // 符合结果的次数加一
                for (int i = 1; i <= n; i++) {
                    if (a[i] == 0) System.out.print('a');
                    else System.out.print('b');
                }
                System.out.println('b');
            }
            return;
        }
        /*================================================*/

        /*====================第一部分====================*/
        for (int i = 0; i < 2; i++) { // 每进行一次递归，即调用一次函数到达第step位置上，就开始尝试确定遇花还是逢店，0店，1花
            if ((i == 0 && book[i] < 5) || (i == 1 && book[i] < 9)) { // 判断逢店的次数不超过5次，遇花的次数不超过9次
                a[step] = i; // 将step位置是遇店还是逢花标记下来
                book[i]++; // 将出现过的路标加1，表示遇见经过一次
                dfs(step + 1); // 前往下一个位置
                book[i]--; // 从下一个位置退回来后，重新对这个位置遇见的路标做尝试，所以要清除之前遇见的路标的次数
            }
        }
        /*================================================*/

        if (step == 1) System.out.println("答案一共有" + sum + "个"); // 重新到达第一层递归函数调用的时候，即step==1，表示所有递归完成，将统计结果输出
        return;
    }
}